home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / Storage / Bento / SURef.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  7.2 KB  |  267 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        SURef.cpp
  3.  
  4.     Contains:    Implementation SURefKeeper class.
  5.  
  6.     Owned by:    Vincent Lo
  7.  
  8.     Copyright:    © 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <6>    10/24/95    jpa        1293441: DMC: Bento memory reserve.
  13.          <5>     8/12/95    TÇ        1276806 Optimization: use kODFalse instead
  14.                                     of kODTrue in comparisons
  15.          <4>     5/26/95    VL        1251403: Multithreading naming support.
  16.          <3>     4/27/95    EL        1241327: The previous checkin destroy the
  17.                                     ref and write that out.
  18.          <2>     3/29/95    DM        make standard format little endian
  19.          <1>     1/26/95    VL        first checked in
  20.     To Do:
  21.     In Progress:
  22.         
  23. */
  24.  
  25. #ifndef _SUREF_
  26. #include "SURef.h"
  27. #endif
  28.  
  29. #ifndef _FLIPEND_
  30. #include "FlipEnd.h"
  31. #endif
  32.  
  33. #ifndef _ODTYPES_
  34. #include <ODTypes.h>
  35. #endif
  36.  
  37. #ifndef SOM_Module_OpenDoc_StdProps_defined
  38. #include <StdProps.xh>
  39. #endif
  40.  
  41. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  42. #include <StdTypes.xh>
  43. #endif
  44.  
  45. #ifndef __CM_API__
  46. #include "CMAPI.h"
  47. #endif
  48.  
  49. #ifndef _EXCEPT_
  50. #include <Except.h>
  51. #endif
  52.  
  53. #ifndef _BENTODEF_
  54. #include "BentoDef.h"
  55. #endif
  56.  
  57. #ifndef SOM_CMStorageUnit_xh
  58. #include <CMSU.xh>
  59. #endif
  60.  
  61. #ifndef _SESSHDR_
  62. #include "SessHdr.h"
  63. #endif
  64.  
  65. //==============================================================================
  66. // Constants
  67. //==============================================================================
  68.  
  69. #define kPlatformRefLowBitsMask 0x7FFFFFFF
  70. #define kPlatformRefHighBitMask 0x80000000
  71.  
  72. #ifdef _PLATFORM_BIG_ENDIAN_
  73.  
  74. #define kStdRefLowBitsMask 0xFFFFFF7F
  75. #define kStdRefHighBitMask 0x00000080
  76.  
  77. #else
  78.  
  79. #define kStdRefLowBitsMask 0x7FFFFFFF
  80. #define kStdRefHighBitMask 0x80000000
  81.  
  82. #endif /* _PLATFORM_BIG_ENDIAN_ */
  83.  
  84. //==============================================================================
  85. // Function Prototype
  86. //==============================================================================
  87.  
  88. ODULong GetULRefValueFromSURef(ODStorageUnitRef ref);
  89.  
  90.  
  91. //------------------------------------------------------------------------------
  92. // GetULRefValueFromSURef
  93. //------------------------------------------------------------------------------
  94.  
  95. ODULong GetULRefValueFromSURef(ODStorageUnitRef ref)
  96. {
  97.     ODULong    longValue = ConvertODULongFromStd(*((ODULong*) ref));
  98.     return longValue & kPlatformRefLowBitsMask;
  99. }
  100.  
  101. //==============================================================================
  102. // SURefKeeper
  103. //==============================================================================
  104.  
  105. //------------------------------------------------------------------------------
  106. // SURefKeeper::SURefKeeper
  107. //------------------------------------------------------------------------------
  108.  
  109. SURefKeeper::SURefKeeper(CMStorageUnit* su)
  110. {
  111.     fSU = su;
  112.     fCurrentSURef = 0;
  113.     fDirty = kODFalse;
  114. }
  115.  
  116. //------------------------------------------------------------------------------
  117. // SURefKeeper::~SURefKeeper
  118. //------------------------------------------------------------------------------
  119.  
  120. SURefKeeper::~SURefKeeper()
  121. {
  122. }
  123.  
  124. //------------------------------------------------------------------------------
  125. // SURefKeeper::Internalize
  126. //------------------------------------------------------------------------------
  127.  
  128. void SURefKeeper::Internalize()
  129. {
  130.     Environment* ev = somGetGlobalEnvironment();
  131.     CMContainer container = fSU->GetCMContainer(ev);
  132.     ODSessionMustHaveCMAllocReserve(container);
  133.     
  134.     CMObject    object = fSU->GetObject(ev);
  135.     
  136.     if (fCurrentSURef == 0) {
  137.         CMProperty property = CMRegisterProperty(container, kODPropCurrentSURef);
  138.         if (property == kODNULL)
  139.             THROW(kODErrBentoInvalidProperty);
  140.         
  141.         CMType type = CMRegisterType(container, kODULong);
  142.         if (type == kODNULL)
  143.             THROW(kODErrBentoInvalidType);
  144.  
  145.         CMValue value = CMUseValue(object, property, type);
  146.         if (value != kODNULL) {
  147.             ODULong stdRef;
  148.             CMReadValueData(value, &stdRef, 0, sizeof(ODStorageUnitRef));
  149.             CMReleaseValue(value);
  150.             fCurrentSURef = ConvertODULongFromStd(stdRef);
  151.         }
  152.         else {
  153.             ODULong stdRef = ConvertODULongToStd(fCurrentSURef);
  154.             value = CMNewValue(object, property, type);
  155.             CMWriteValueData(value, &stdRef, 0, sizeof(ODStorageUnitRef));
  156.         }
  157.     }
  158.     ODSessionRestoreCMAllocReserve(container);
  159. }
  160.  
  161. //------------------------------------------------------------------------------
  162. // SURefKeeper::Externalize
  163. //------------------------------------------------------------------------------
  164.  
  165. void SURefKeeper::Externalize()
  166. {
  167.     Environment* ev = somGetGlobalEnvironment();
  168.     CMContainer container = fSU->GetCMContainer(ev);
  169.     ODSessionMustHaveCMAllocReserve(container);
  170.  
  171.     CMObject    object = fSU->GetObject(ev);
  172.  
  173.     if (fDirty != kODFalse) {
  174.         CMProperty property = CMRegisterProperty(container, kODPropCurrentSURef);
  175.         if (property == kODNULL)
  176.             THROW(kODErrBentoInvalidProperty);
  177.         
  178.         CMType type = CMRegisterType(container, kODULong);
  179.         if (type == kODNULL)
  180.             THROW(kODErrBentoInvalidType);
  181.  
  182.         ODULong stdRef = ConvertODULongToStd(fCurrentSURef);
  183.         
  184.         CMValue value = CMUseValue(object, property, type);
  185.         if (value != kODNULL) {
  186.             CMWriteValueData(value, &stdRef, 0, sizeof(ODStorageUnitRef));
  187.             CMReleaseValue(value);
  188.         }
  189.         else {
  190.             value = CMNewValue(object, property, type);
  191.             CMWriteValueData(value, &stdRef, 0, sizeof(ODStorageUnitRef));
  192.         }
  193.         
  194.         fDirty = kODFalse;
  195.     }
  196.     ODSessionRestoreCMAllocReserve(container);
  197. }
  198.     
  199. //------------------------------------------------------------------------------
  200. // SURefKeeper::GetNextSURef
  201. //------------------------------------------------------------------------------
  202.  
  203. void SURefKeeper::GetNextSURef(ODStorageUnitRef ref, ODBoolean strong)
  204. {
  205.     Internalize();
  206.     fCurrentSURef++;
  207.     fDirty = kODTrue;
  208.     
  209.     ODULong ulRef = fCurrentSURef;
  210.     if (strong != kODFalse)
  211.         ulRef = ulRef & kPlatformRefLowBitsMask;
  212.     else
  213.         ulRef = ulRef | kPlatformRefHighBitMask;
  214.     
  215.     *((ODULong*) ref) = ConvertODULongToStd(ulRef);
  216. }
  217.  
  218. //------------------------------------------------------------------------------
  219. // SURefKeeper::Reset
  220. //------------------------------------------------------------------------------
  221.  
  222. void SURefKeeper::Reset(ODStorageUnitRef ref)
  223. {
  224.     ODULong    inRef = GetULRefValueFromSURef(ref);
  225.  
  226.     if (inRef > fCurrentSURef) {
  227.         fCurrentSURef = inRef;
  228.         fDirty = kODTrue;
  229.     }
  230. }
  231.     
  232. //------------------------------------------------------------------------------
  233. // SURefKeeper::IsStrongSURef
  234. //------------------------------------------------------------------------------
  235.  
  236. ODBoolean SURefKeeper::IsStrongSURef(ODStorageUnitRef ref)
  237. {
  238.     return (*((ODULong*) ref) & kStdRefHighBitMask ? kODFalse : kODTrue);
  239. }
  240.  
  241. //------------------------------------------------------------------------------
  242. // SURefKeeper::IsWeakSURef
  243. //------------------------------------------------------------------------------
  244.  
  245. ODBoolean SURefKeeper::IsWeakSURef(ODStorageUnitRef ref)
  246. {
  247.     return (*((ODULong*) ref) & kStdRefHighBitMask ? kODTrue : kODFalse);
  248. }
  249.  
  250. //------------------------------------------------------------------------------
  251. // SURefKeeper::InvalidateSURef
  252. //------------------------------------------------------------------------------
  253.  
  254. void SURefKeeper::InvalidateSURef(ODStorageUnitRef ref)
  255. {
  256.     *((ODULong*) ref) = 0;
  257. }
  258.  
  259. //------------------------------------------------------------------------------
  260. // SURefKeeper::IsValidSURef
  261. //------------------------------------------------------------------------------
  262.  
  263. ODBoolean SURefKeeper::IsValidSURef(ODStorageUnitRef ref)
  264. {
  265.     return (*((ODULong*) ref) == 0 ? kODFalse : kODTrue);
  266. }
  267.